package com.pj.project.sys_user;

import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.pj.project.sys_user_password.SysUserPasswordService;
import com.pj.project4sp.SP;
import com.pj.utils.sg.AjaxError;
import com.pj.utils.sg.NbUtil;

import cn.dev33.satoken.sso.SaSsoUtil;

/**
 * Service: sys_user -- 用户表
 * 
 * @author kong
 * @since 2022-11-25
 */
@Service
public class SysUserService {

	/** 底层 Mapper 对象 */
	@Autowired
	SysUserMapper sysUserMapper;

	/** 底层 Service 对象 */
	@Autowired
	SysUserPasswordService sysUserPasswordService;

	/** 新增用户，返回新增的用户对象 */  
	@Transactional(rollbackFor = Exception.class)
	public SysUser add(SysUser s){
		// 如果没有提供手机号或邮箱，将其从空字符串设置为空 
		if(NbUtil.isNull(s.getPhone())) {
			s.setPhone(null);
		}
		if(NbUtil.isNull(s.getEmail())) {
			s.setEmail(null);
		}

		// 校验数据完整性 
		SysUserUtil.checkByAdd(s);

		// 写入数据库 
		sysUserMapper.add(s);
		
		// 查询
		SysUser s2;
		if(s.getId() == null || s.getId() == 0) {
			s2 = sysUserMapper.getById(SP.publicMapper.getPrimarykey());
		} else {
			s2 = sysUserMapper.getById(s.getId());
		}
		
		// 改密码
		sysUserPasswordService.updatePassword(s2.getId(), s.getPassword2(), true);

		//  返回 
		return s2;
	}

	/** 删除用户 */  
	public void delete(long id){
		int line = SP.publicMapper.updateColumnById(SysUser.TABLE_NAME, "is_del", 2, id);
		AjaxError.notLine(line, "删除失败, 数据可能并不存在");
		// 单点注销这个账号 
		SaSsoUtil.ssoLogout(id);
	}

	/** 恢复用户 */  
	public void unDelete(long id){
		// 先校验一下各个属性，是否被占用 
		SysUser s = sysUserMapper.getById(id);
		AjaxError.notIsNull(s, "用户不存在");
		SysUserUtil.checkUsername(s);
		SysUserUtil.checkPhone(s);
		SysUserUtil.checkEmail(s);
		
		// 开始恢复 
		int line = SP.publicMapper.updateColumnById(SysUser.TABLE_NAME, "is_del", 1, id);
		AjaxError.notLine(line, "恢复失败, 数据可能并不存在");
	}

	/** 彻底删除用户 */  
	public void realDelete(long id){
		// 为保证数据安全性，物理删除前必须先逻辑删除 
		SysUser s = sysUserMapper.getById(id);
		AjaxError.notIsNull(s, "用户不存在");
		AjaxError.notTrue(s.getIsDel() == 1, "请先从用户列表中将此用户删除，然后再进行 [ 彻底删除 ] 操作");
		// 开始删除 
		int line = SP.publicMapper.deleteById(SysUser.TABLE_NAME, id);
		AjaxError.notLine(line, "彻底删除失败, 数据可能并不存在");
		// 单点注销这个账号 
		SaSsoUtil.ssoLogout(id);
	}

	/** 修改用户，返回修改的用户对象 */  
	@Transactional(rollbackFor = Exception.class)
	public SysUser update(SysUser s){
		// 数据校验 
		SysUserUtil.checkByUpdate(s);
		
		// 修改 
		int line = sysUserMapper.update(s);
		AjaxError.notLine(line, "修改失败, 数据可能并不存在");

		// 如果给禁用了，就停掉其 Token 有效果性，使其账号的登录状态立即无效 
		if(s.getStatus() == 2) {
			SaSsoUtil.ssoLogout(s.getId());
		}
		
		//  返回最新对象  
		return sysUserMapper.getById(s.getId());
	}

}
